Passed
Push — master ( d06db4...975886 )
by EMP
01:14
created

main.js ➔ destroyAccount   B

Complexity

Conditions 6

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 13
dl 0
loc 22
rs 8.6666
c 0
b 0
f 0
cc 6
1
"use strict";
2
3
sodium.ready.then(function() {
4
5
const ae = new AllEars(function(ok) {
6
	if (ok) {
7
		document.getElementById("btn_enter").disabled = false;
8
	} else {
9
		console.log("Failed to load All-Ears");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
10
	}
11
});
12
13
let page=0;
14
15
function navMenu(num) {
16
	document.getElementById("div_readmsg").hidden = true;
17
18
	const b = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
19
	const d = document.getElementsByClassName("maindiv");
20
21
	for (let i = 0; i < 5; i++) {
22
		if (i === num) {
23
			b[i].disabled = true;
24
			d[i].hidden = false;
25
		} else {
26
			b[i].disabled = false;
27
			d[i].hidden = true;
28
		}
29
	}
30
}
31
32
function getCountryName(countryCode) {
33
	return "Unknown countrycode: " + countryCode;
34
}
35
36
function getCountryFlag(countryCode) {
37
	return sodium.to_string(new Uint8Array([
38
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
39
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
40
	]));
41
}
42
43
function addMessages() {
44
	const maxExt = ae.GetExtMsgCount();
45
	const maxInt = ae.GetIntMsgCount();
46
47
	let numExt = 0;
48
	let numInt = 0;
49
50
	//TODO handle sent messages separately
51
52
	for (let i = 0; i < (page * 20) + 20; i++) {
53
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : 0;
54
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : 0;
55
		if (tsInt === 0 && tsExt === 0) break;
56
57
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
58
			if (i < (page * 20)) {
59
				numInt++;
60
				continue;
61
			}
62
63
			addIntMessage(numInt);
64
			numInt++;
65
		} else if (tsExt !== 0) {
66
			if (i < (page * 20)) {
67
				numExt++;
68
				continue;
69
			}
70
71
			addExtMessage(numExt);
72
			numExt++;
73
		}
74
	}
75
}
76
77
function addExtMessage(i) {
78
	const tbl = document.getElementById("tbd_inbox");
79
80
	const row = tbl.insertRow(-1);
81
	const cellTime  = row.insertCell(-1);
82
	const cellSubj  = row.insertCell(-1);
83
	const cellFrom1 = row.insertCell(-1);
84
	const cellFrom2 = row.insertCell(-1);
85
	const cellTo    = row.insertCell(-1);
86
	const cellDel   = row.insertCell(-1);
87
88
	const ts = ae.GetExtMsgTime(i);
89
	cellTime.setAttribute("data-ts", ts);
90
	cellTime.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
91
	cellTime.className = "mono";
92
93
	cellSubj.textContent = ae.GetExtMsgTitle(i);
94
95
	const from = ae.GetExtMsgHdrFrom(i);
96
	const from2 = from.substring(from.indexOf("@") + 1);
97
	const cc = ae.GetExtMsgCountry(i);
98
99
	cellFrom1.textContent = from.substring(0, from.indexOf("@"));
100
101
	const flag = document.createElement("abbr");
102
	flag.textContent = getCountryFlag(cc);
103
	flag.title = getCountryName(cc);
104
	cellFrom2.appendChild(flag);
105
106
	const fromText = document.createElement("span");
107
	fromText.textContent = " " + from2;
108
	cellFrom2.appendChild(fromText);
109
110
	cellTo.textContent = ae.GetExtMsgEnvTo(i);
111
	cellTo.className = (ae.GetExtMsgEnvTo(i).length === 16) ? "mono" : "";
112
113
	cellDel.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetExtMsgIdHex(i) + "\">";
114
115
	cellSubj.onclick = function() {
116
		navMenu(-1);
117
		document.getElementById("div_readmsg").hidden = false;
118
		document.getElementById("readmsg_head").hidden = false;
119
		document.getElementById("readmsg_levelinfo").hidden = true;
120
		document.getElementById("readmsg_extmsg").hidden = false;
121
		document.getElementById("readmsg_greet").textContent = ae.GetExtMsgGreet(i);
122
		document.getElementById("readmsg_tls").textContent = ae.GetExtMsgTLS(i);
123
		document.getElementById("readmsg_ip").textContent = ae.GetExtMsgIp(i);
124
125
		document.getElementById("readmsg_country").textContent = getCountryName(cc) + " " + getCountryFlag(cc);
126
127
		let flagText = "";
128
		if (!ae.GetExtMsgFlagPExt(i)) flagText += "<abbr title=\"The sender did not use the Extended (ESMTP) protocol\">SMTP</abbr> ";
129
		if (!ae.GetExtMsgFlagQuit(i)) flagText += "<abbr title=\"The sender did not issue the required QUIT command\">QUIT</abbr> ";
130
		if (ae.GetExtMsgFlagRare(i)) flagText += "<abbr title=\"The sender issued unusual command(s)\">RARE</abbr> ";
131
		if (ae.GetExtMsgFlagFail(i)) flagText += "<abbr title=\"The sender issued invalid command(s)\">FAIL</abbr> ";
132
		if (ae.GetExtMsgFlagPErr(i)) flagText += "<abbr title=\"The sender violated the protocol\">PROT</abbr> ";
133
		document.getElementById("readmsg_flags").innerHTML = flagText.trim();
134
135
		document.getElementById("readmsg_title").textContent = ae.GetExtMsgTitle(i);
136
		document.getElementById("readmsg_from").textContent = ae.GetExtMsgEnvFrom(i);
137
		document.getElementById("readmsg_to").textContent = ae.GetExtMsgEnvTo(i);
138
		document.getElementById("readmsg_body").innerHTML = ae.GetExtMsgBody(i);
139
		document.getElementById("readmsg_headers").textContent = ae.GetExtMsgHeaders(i);
140
141
		document.getElementById("readmsg_from").className = "";
142
		document.getElementById("readmsg_to").className = (ae.GetExtMsgEnvTo(i).length === 16) ? "mono" : "";
143
	};
144
145 View Code Duplication
	cellDel.children[0].onchange = function() {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
146
		if (!cellDel.children[0].checked) {
147
			const checkboxes = tbl.getElementsByTagName("input");
148
			let checked = false;
149
150
			for (let j = 0; j < checkboxes.length; j++) {
151
				if (checkboxes[j].checked) {
152
					checked = true;
153
					break;
154
				}
155
			}
156
157
			if (!checked) {
158
				document.getElementById("btn_msgdel").hidden = true;
159
				return;
160
			}
161
		}
162
163
		document.getElementById("btn_msgdel").hidden = false;
164
	};
165
}
166
167
function addIntMessage(i) {
168
	const tbl = document.getElementById("tbd_inbox");
169
170
	const row = tbl.insertRow(-1);
171
	const cellTime  = row.insertCell(-1);
172
	const cellSubj  = row.insertCell(-1);
173
	row.insertCell(-1); // cellFrom1: empty
174
	const cellFrom2 = row.insertCell(-1);
175
	const cellTo    = row.insertCell(-1);
176
	const cellDel   = row.insertCell(-1);
177
178
	const ts = ae.GetIntMsgTime(i);
179
	cellTime.setAttribute("data-ts", ts);
180
	cellTime.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
181
	cellTime.className = "mono";
182
183
	cellSubj.textContent = ae.GetIntMsgTitle(i);
184
185
	cellFrom2.textContent = ae.GetIntMsgFrom(i);
186
	cellTo.textContent = ae.GetIntMsgTo(i);
187
188
	cellTo.className = (ae.GetIntMsgTo(i).length === 16) ? "mono" : "";
189
	cellFrom2.className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
190
191
	cellDel.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetIntMsgIdHex(i) + "\">";
192
193
	cellSubj.onclick = function() {
194
		navMenu(-1);
195
		document.getElementById("div_readmsg").hidden = false;
196
		document.getElementById("readmsg_head").hidden = false;
197
		document.getElementById("readmsg_levelinfo").hidden = false;
198
		document.getElementById("readmsg_extmsg").hidden = true;
199
200
		document.getElementById("readmsg_title").textContent = ae.GetIntMsgTitle(i);
201
		document.getElementById("readmsg_from").textContent  = ae.GetIntMsgFrom(i);
202
		document.getElementById("readmsg_to").textContent    = ae.GetIntMsgTo(i);
203
		document.getElementById("readmsg_body").textContent  = ae.GetIntMsgBody(i);
204
		document.getElementById("readmsg_level").textContent = ae.GetIntMsgLevel(i);
205
206
		document.getElementById("readmsg_from").className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
207
		document.getElementById("readmsg_to").className = (ae.GetIntMsgTo(i).length === 16) ? "mono" : "";
208
	};
209
210 View Code Duplication
	cellDel.children[0].onchange = function() {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
211
		if (!cellDel.children[0].checked) {
212
			const checkboxes = tbl.getElementsByTagName("input");
213
			let checked = false;
214
215
			for (let j = 0; j < checkboxes.length; j++) {
216
				if (checkboxes[j].checked) {
217
					checked = true;
218
					break;
219
				}
220
			}
221
222
			if (!checked) {
223
				document.getElementById("btn_msgdel").hidden = true;
224
				return;
225
			}
226
		}
227
228
		document.getElementById("btn_msgdel").hidden = false;
229
	};
230
}
231
232
function addFile(num) {
233
	const table = document.getElementById("tbody_files");
234
	const row = table.insertRow(-1);
235
236
	let cell = row.insertCell(-1);
237
	cell.textContent = new Date(ae.GetUplMsgTime(num) * 1000).toISOString().slice(0, 10)
238
239
	cell = row.insertCell(-1);
240
	cell.textContent = ae.GetUplMsgBytes(num) / 1024;
241
242
	cell = row.insertCell(-1);
243
	cell.textContent = ae.GetUplMsgTitle(num);
244
245
	cell = row.insertCell(-1);
246
	cell.innerHTML = "<button type=\"button\">D</button>";
247
	cell.children[0].onclick = function() {
248
		const a = document.createElement("a");
249
		a.href = URL.createObjectURL(new Blob([ae.GetUplMsgBody(num).buffer]));
250
		a.download = ae.GetUplMsgTitle(num);
251
		a.click();
252
253
		URL.revokeObjectURL(a.href);
254
		a.href = "";
255
		a.download = "";
256
	};
257
258
	cell = row.insertCell(-1);
259
	cell.innerHTML = "<button type=\"button\">X</button>";
260
	cell.children[0].onclick = function() {
261
		ae.Message_Delete([ae.GetUplMsgIdHex(num)], function(error) {
262
			if (error === 0) {
263
				tr.remove();
0 ignored issues
show
Bug introduced by
The variable tr seems to be never declared. If this is a global, consider adding a /** global: tr */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
264
			} else {
265
				console.log("Failed deleting file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
266
			}
267
		});
268
	};
269
}
270
271
function destroyAccount(upk_hex) {
272
	const tbl = document.getElementById("tbody_admin");
273
274
	let rowid = -1;
275
276
	for (let i = 0; i < tbl.rows.length; i++) {
277
		if (upk_hex === tbl.rows[i].cells[0].textContent) {
278
			rowid = i;
279
			break;
280
		}
281
	}
282
283
	if (rowid === -1) return;
284
285
	ae.Account_Delete(upk_hex, function(success) {
286
		if (success) {
287
			tbl.deleteRow(rowid);
288
		} else {
289
			console.log("Failed to destroy account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
290
		}
291
	});
292
}
293
294
function setAccountLevel(upk_hex, level) {
295
	const tbl = document.getElementById("tbody_admin");
296
297
	let rowid = -1;
298
299
	for (let i = 0; i < tbl.rows.length; i++) {
300
		if (tbl.rows[i].cells[0].textContent === upk_hex) {
301
			rowid = i;
302
			break;
303
		}
304
	}
305
306
	if (rowid === -1) return;
307
308
	ae.Account_Update(upk_hex, level, function(success) {
309
		if (!success) {
310
			console.log("Failed to set account level");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
311
			return;
312
		}
313
314
		tbl.rows[rowid].cells[4].textContent = level;
315
316
		if (level === 0) {
317
			tbl.rows[rowid].cells[5].children[0].disabled = false;
318
			tbl.rows[rowid].cells[6].children[0].disabled = true;
319
		} else if (level === ae.GetLevelMax()) {
320
			tbl.rows[rowid].cells[5].children[0].disabled = true;
321
			tbl.rows[rowid].cells[6].children[0].disabled = false;
322
		} else {
323
			tbl.rows[rowid].cells[5].children[0].disabled = false;
324
			tbl.rows[rowid].cells[6].children[0].disabled = false;
325
		}
326
327
		const pkHex = ae.Admin_GetUserPkHex(rowid);
328
		const currentLevel = ae.Admin_GetUserLevel(rowid);
329
		tbl.rows[rowid].cells[5].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
330
		tbl.rows[rowid].cells[6].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
331
	});
332
}
333
334
function deleteAddress(addr) {
335
	let btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
336
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
337
338
	let addressToDelete = -1;
339
340
	for (let i = 0; i < ae.GetAddressCount(); i++) {
341
		if (addr === ae.GetAddress(i)) {
342
			addressToDelete = i;
343
			break;
344
		}
345
	}
346
347
	if (addressToDelete === -1) return;
348
349
	ae.Address_Delete(addressToDelete, function(error) {
350
		if (error !== 0) {
351
			console.log("Failed to delete address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
352
			return;
353
		}
354
355
		document.getElementById("tbody_opt_addr").deleteRow(addressToDelete);
356
		document.getElementById("send_from").remove(addressToDelete);
357
358
		document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
359
		document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
360
361
		if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) document.getElementById("btn_newaddress").disabled = false;
362
		if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) document.getElementById("btn_newshieldaddress").disabled = false;
363
364
		ae.Private_Update(function(error2) {
365
			if (!error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
366
367
			btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
368
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
369
		});
370
	});
371
}
372
373
function shieldMix(addr) {
374
	let newAddr = "";
375
376
	for (let i = 0; i < 16; i++) {
377
		switch (addr.charAt(i)) {
378
			case '1':
379
				newAddr += "1iIlL".charAt(Math.floor(Math.random() * 5));
380
				break;
381
			case '0':
382
				newAddr += "0oO".charAt(Math.floor(Math.random() * 3));
383
				break;
384
			case 'w':
385
				newAddr += "VvWw".charAt(Math.floor(Math.random() * 4));
386
				break;
387
			default:
388
				newAddr += (Math.random() > 0.5) ? addr.charAt(i) : addr.charAt(i).toUpperCase();
389
		}
390
	}
391
392
	return newAddr;
393
}
394
395
function addAddress(num) {
396
	const addrTable = document.getElementById("tbody_opt_addr");
397
	const row = addrTable.insertRow(-1);
398
399
	let cell = row.insertCell(-1);
400
	cell.textContent = ae.GetAddress(num);
401
	if (cell.textContent.length === 16) cell.className = "mono";
402
	cell.onclick = function() {
403
		if (cell.textContent.length === 16)
404
			navigator.clipboard.writeText(shieldMix(cell.textContent) + "@" + ae.GetDomainEml());
405
		else
406
			navigator.clipboard.writeText(cell.textContent + "@" + ae.GetDomainEml());
407
	};
408
409
	cell = row.insertCell(-1);
410
	cell.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
411
412
	cell = row.insertCell(-1);
413
	cell.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
414
415
	cell = row.insertCell(-1);
416
	cell.innerHTML = "<button type=\"button\">X</button>";
417
	cell.children[0].onclick = function() {deleteAddress(ae.GetAddress(num));};
418
419
	const opt = document.createElement("option");
420
	opt.value = ae.GetAddress(num);
421
	opt.textContent = ae.GetAddress(num) + "@" + ae.GetDomainEml();
422
	document.getElementById("send_from").appendChild(opt);
423
}
424
425
function clearMessages() {
426
	document.getElementById("tbd_inbox").innerHTML = "";
427
	document.getElementById("tbd_snbox").innerHTML = "";
428
	document.getElementById("tbody_files").innerHTML = "";
429
}
430
431
function delMsgs(tblName, btnName) {
432
	const cbs = document.getElementsByClassName("delMsg");
433
	const ids = [];
434
435
	for (let i = 0; i < cbs.length; i++) {
436
		if (cbs[i].checked) ids.push(cbs[i].getAttribute("data-id"));
437
	}
438
439
	if (ids.length > 0) ae.Message_Delete(ids, function(success) {
440
		if (success) {
441
			clearMessages();
442
			addMessages();
443
			document.getElementById(btnName).hidden = true;
444
		} else {
445
			console.log("Failed to delete messages");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
446
		}
447
	});
448
}
449
450
function deleteContact(email) {
451
	const tbl = document.getElementById("tbody_notes_contact");
452
	const rows = tbl.rows;
453
454
	for (let i = 0; i < rows.length; i++) {
455
		if (email === rows[i].cells[0].textContent) {
456
			ae.DeleteContact(i);
457
			tbl.deleteRow(i);
458
			break;
459
		}
460
	}
461
462
	document.getElementById("btn_savenotes").hidden = false;
463
}
464
465
function addContactToTable(mail, name, note) {
466
	const contactTable = document.getElementById("tbody_notes_contact");
467
	const row = contactTable.insertRow(-1);
468
	const cellMail = row.insertCell(-1);
469
	const cellName = row.insertCell(-1);
470
	const cellNote = row.insertCell(-1);
471
	const cellBtnD = row.insertCell(-1);
472
473
	cellMail.className = "left";
474
	cellName.className = "left";
475
	cellNote.className = "left";
476
477
	cellMail.textContent = mail;
478
	cellName.textContent = name;
479
	cellNote.textContent = note;
480
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
481
482
	cellBtnD.onclick = function() {deleteContact(mail);};
483
}
484
485
function addRowAdmin(num) {
486
	const table = document.getElementById("tbody_admin");
487
488
	const row = table.insertRow(-1);
489
	const cellPk = row.insertCell(-1);
490
	const cellMb = row.insertCell(-1);
491
	const cellNa = row.insertCell(-1);
492
	const cellSa = row.insertCell(-1);
493
	const cellLv = row.insertCell(-1);
494
	const cellBtnPl = row.insertCell(-1);
495
	const cellBtnMn = row.insertCell(-1);
496
	const cellBtnDe = row.insertCell(-1);
497
498
	cellPk.textContent = ae.Admin_GetUserPkHex(num);
499
	cellMb.textContent = ae.Admin_GetUserSpace(num);
500
	cellNa.textContent = ae.Admin_GetUserNAddr(num);
501
	cellSa.textContent = ae.Admin_GetUserSAddr(num);
502
	cellLv.textContent = ae.Admin_GetUserLevel(num);
503
	cellBtnPl.innerHTML = "<button type=\"button\">+</button>";
504
	cellBtnMn.innerHTML = "<button type=\"button\">-</button>";
505
	cellBtnDe.innerHTML = "<button type=\"button\">X</button>";
506
507
	cellPk.className = "mono";
508
	if (ae.Admin_GetUserLevel(num) === ae.GetLevelMax()) cellBtnPl.children[0].disabled = true;
509
	if (ae.Admin_GetUserLevel(num) === 0) cellBtnMn.children[0].disabled = true;
510
511
	const pkHex = ae.Admin_GetUserPkHex(num);
512
	const currentLevel = ae.Admin_GetUserLevel(num);
513
	cellBtnPl.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
514
	cellBtnMn.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
515
	cellBtnDe.children[0].onclick = function() {destroyAccount(pkHex);};
516
}
517
518
function reloadInterface() {
519
	if (!ae.IsUserAdmin()) document.getElementById("btn_toadmin").hidden = true;
520
	document.getElementById("div_begin").hidden = true;
521
	document.getElementById("div_allears").hidden = false;
522
523
	clearMessages();
524
	document.getElementById("tbody_admin").innerHTML = "";
525
	document.getElementById("tbody_files").innerHTML = "";
526
	document.getElementById("tbody_notes_contact").innerHTML = "";
527
	document.getElementById("tbody_opt_addr").innerHTML = "";
528
529
	// Contacts
530
	for (let i = 0; i < ae.GetContactCount(); i++) {
531
		addContactToTable(
532
			ae.GetContactMail(i),
533
			ae.GetContactName(i),
534
			ae.GetContactNote(i)
535
		);
536
	}
537
538
	// Addresses
539
	for (let i = 0; i < ae.GetAddressCount(); i++) {
540
		addAddress(i);
541
	}
542
543
	document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
544
	document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
545
	document.getElementById("addr_max_normal").textContent = ae.GetLimitNormalA(ae.GetUserLevel());
546
	document.getElementById("addr_max_shield").textContent = ae.GetLimitShieldA(ae.GetUserLevel());
547
548
	if (ae.GetAddressCountNormal() >= ae.GetLimitNormalA(ae.GetUserLevel())) document.getElementById("btn_newaddress").disabled = true;
549
	if (ae.GetAddressCountShield() >= ae.GetLimitShieldA(ae.GetUserLevel())) document.getElementById("btn_newshieldaddress").disabled = true;
550
551
	if (ae.IsUserAdmin()) {
552
		const tblLimits = document.getElementById("tbl_limits");
553
		for (let i = 0; i < 4; i++) {
554
			tblLimits.rows[i].cells[1].children[0].value = ae.GetStorageLimit(i);
555
			tblLimits.rows[i].cells[2].children[0].value = ae.GetLimitNormalA(i);
556
			tblLimits.rows[i].cells[3].children[0].value = ae.GetLimitShieldA(i);
557
		}
558
559
		document.getElementById("btn_admin_savelimits").onclick = function() {
560
			const storageLimit = [];
561
			const addrNrmLimit = [];
562
			const addrShdLimit = [];
563
564
			for (let i = 0; i < 4; i++) {
565
				storageLimit[i] = tblLimits.rows[i].cells[1].children[0].value;
566
				addrNrmLimit[i] = tblLimits.rows[i].cells[2].children[0].value;
567
				addrShdLimit[i] = tblLimits.rows[i].cells[3].children[0].value;
568
			}
569
570
			ae.SetLimits(storageLimit, addrNrmLimit, addrShdLimit, function(success) {
571
				if (!success) {
572
					console.log("Failed to update limits");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
573
				}
574
			});
575
		};
576
577
		for (let i = 0; i < ae.Admin_GetUserCount(); i++) {
578
			addRowAdmin(i);
579
		}
580
	}
581
}
582
583
document.getElementById("btn_inbox_prev").onclick = function() {
584
	if (page > 0) {
585
		page--;
586
		clearMessages();
587
		addMessages();
588
		this.disabled = (page === 0);
589
	}
590
};
591
592
document.getElementById("btn_inbox_next").onclick = function() {
593
// TODO: Check if page too high
594
//	if (page > 0) {
595
		page++;
596
		clearMessages();
597
		addMessages();
598
		document.getElementById("btn_inbox_prev").disabled = false;
599
//	}
600
};
601
602
document.getElementById("btn_enter").onclick = function() {
603
	const txtSkey = document.getElementById("txt_skey");
604
	if (!txtSkey.reportValidity()) return;
605
606
	const btn = this;
607
	btn.disabled = true;
608
609
	ae.SetKeys(txtSkey.value, function(successSetKeys) {
610
		if (!successSetKeys) {
611
			console.log("Invalid format for key");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
612
			btn.disabled = false;
613
			return;
614
		}
615
616
		ae.Message_Browse(false, true, function(statusBrowse) {
617
			if (statusBrowse !== 0) {
618
				console.log("Failed to enter");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
619
				btn.disabled = false;
620
				return;
621
			}
622
623
			txtSkey.value = "";
624
			reloadInterface();
625
			document.getElementById("btn_refresh").click();
626
		});
627
	});
628
};
629
630
document.getElementById("btn_refresh").onclick = function() {
631
	const btn = this;
632
	btn.disabled = true;
633
634
	ae.Message_Browse(true, false, function(successBrowse) {
635
		if (successBrowse === 0) {
636
			clearMessages();
637
			addMessages();
638
			for (let i = ae.GetUplMsgCount() - 1; i >= 0; i--) {addFile(i);}
639
		} else {
640
			console.log("Failed to refresh");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
641
		}
642
643
		btn.disabled = false;
644
	});
645
};
646
647
document.getElementById("btn_contact_add").onclick = function() {
648
	const txtMail = document.getElementById("txt_newcontact_mail");
649
	const txtName = document.getElementById("txt_newcontact_name");
650
	const txtNote = document.getElementById("txt_newcontact_note");
651
652
	addContactToTable(txtMail.value, txtName.value, txtNote.value);
653
	ae.AddContact(txtMail.value, txtName.value, txtNote.value);
654
655
	txtMail.value = "";
656
	txtName.value = "";
657
	txtNote.value = "";
658
659
	document.getElementById("btn_savenotes").hidden = false;
660
};
661
662
document.getElementById("btn_savenotes").onclick = function() {
663
	ae.Private_Update(function(success) {
664
		if (success) {
665
			document.getElementById("btn_savenotes").hidden = true;
666
		} else {
667
			console.log("Failed to save note data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
668
		}
669
	});
670
};
671
672
document.getElementById("btn_msgdel").onclick = function() {
673
	delMsgs("tbody_inbox", "btn_msgdel");
674
};
675
676
document.getElementById("btn_sentdel").onclick = function() {
677
	delMsgs("tbody_sentbox", "btn_sentdel");
678
};
679
680
document.getElementById("btn_send").onclick = function() {
681
	const btn = this;
682
	btn.disabled = true;
683
684
	const sfrom = document.getElementById("send_from");
685
	const stitle = document.getElementById("send_title");
686
	const sto = document.getElementById("send_to");
687
	const sbody = document.getElementById("send_body");
688
689
	if (!stitle.reportValidity() || !sto.reportValidity() || !sbody.reportValidity()) return;
690
691
	ae.Address_Lookup(sto.value, function(to_pubkey) {
692
		if (to_pubkey) {
693
			console.log("Lookup ok, trying to send");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
694
695
			ae.Message_Create(stitle.value, sbody.value, sfrom.value, sto.value, to_pubkey, function(success) {
696
				if (success) {
697
					stitle.value = "";
698
					sto.value = "";
699
					sbody.value = "";
700
				} else {
701
					console.log("Failed sending message");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
702
				}
703
704
				btn.disabled = false;
705
			});
706
		} else {
707
			console.log("Failed looking up address");
708
			btn.disabled = false;
709
		}
710
	});
711
};
712
713
document.getElementById("btn_newaddress").onclick = function() {
714
	if (ae.GetAddressCountNormal() >= ae.GetLimitNormalA(ae.GetUserLevel())) return;
715
716
	const txtNewAddr = document.getElementById("txt_newaddress");
717
	if (!txtNewAddr.reportValidity()) return;
718
719
	const btnN = document.getElementById("btn_newaddress");
720
	const btnS = document.getElementById("btn_newshieldaddress");
721
	btnN.disabled = true;
722
	btnS.disabled = true;
723
724
	ae.Address_Create(txtNewAddr.value, function(error1) {
725
		if (error1 === 0) {
726
			ae.Private_Update(function(error2) {
727
				document.getElementById("addr_use_normal").textContent = ae.GetAddressCountNormal();
728
				addAddress(ae.GetAddressCount() - 1);
729
				txtNewAddr.value = "";
730
731
				if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
732
				if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
733
				if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
734
			});
735
		} else {
736
			console.log("Failed to add address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
737
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
738
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
739
		}
740
	});
741
};
742
743
document.getElementById("btn_newshieldaddress").onclick = function() {
744
	if (ae.GetLimitShieldA() >= ae.GetLimitShieldA(ae.GetUserLevel())) return;
745
746
	const btnN = document.getElementById("btn_newaddress");
747
	const btnS = document.getElementById("btn_newshieldaddress");
748
	btnN.disabled = true;
749
	btnS.disabled = true;
750
751
	ae.Address_Create("SHIELD", function(error1) {
752
		if (error1 !== 0) {
753
			console.log("Failed to add Shield address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
754
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
755
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
756
			return;
757
		}
758
759
		ae.Private_Update(function(error2) {
760
			document.getElementById("addr_use_shield").textContent = ae.GetAddressCountShield();
761
			addAddress(ae.GetAddressCount() - 1);
762
763
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
764
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
765
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
766
		});
767
	});
768
};
769
770
document.getElementById("btn_saveaddrdata").onclick = function() {
771
	const tbl = document.getElementById("tbody_opt_addr");
772
773
	for (let i = 0; i < tbl.rows.length; i++) {
774
		ae.SetAddressAccExt(i, tbl.rows[i].cells[1].firstChild.checked);
775
		ae.SetAddressAccInt(i, tbl.rows[i].cells[2].firstChild.checked);
776
	}
777
778
	ae.Address_Update(function(success) {
779
		if (success) {
780
			document.getElementById("btn_saveaddrdata").hidden = true;
781
		} else {
782
			console.log("Failed to save address data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
783
		}
784
	});
785
};
786
787
document.getElementById("btn_admin_addaccount").onclick = function() {
788
	const txtPkey = document.getElementById("txt_newacc_pkey");
789
790
	if (!txtPkey.reportValidity()) return;
791
792
	const btn = document.getElementById("btn_admin_addaccount");
793
	btn.disabled = true;
794
795
	ae.Account_Create(txtPkey.value, function(success) {
796
		if (success) {
797
			addRowAdmin(ae.Admin_GetUserCount() - 1);
798
			txtPkey.value = "";
799
		} else {
800
			console.log("Failed to add account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
801
		}
802
	});
803
804
	btn.disabled = false;
805
};
806
807
document.getElementById("btn_uploadfile").onclick = function() {
808
	const fileSelector = document.getElementById("upfile");
809
	const f = fileSelector.files[0];
810
811
	if (f.name.length + f.size > 8138) {
812
		console.log("Too large");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
813
		fileSelector.value = null;
814
		return;
815
	}
816
817
	const btn = this;
818
	btn.disabled = true;
819
820
	const reader = new FileReader();
821
	reader.onload = function(e) {
0 ignored issues
show
Unused Code introduced by
The parameter e is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
822
		const u8data = new Uint8Array(reader.result);
823
824
		ae.Message_Assign(true, f.name, u8data, function(success) {
825
			if (success) {
826
				addFile(ae.GetFileCount() - 1);
827
				fileSelector.value = null;
828
			} else {
829
				console.log("Failed to upload file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
830
			}
831
832
			btn.disabled = false;
833
		});
834
	};
835
836
	reader.readAsArrayBuffer(f);
837
};
838
839
function navNotesMenu(num) {
840
	for (let i = 0; i < 3; i++) {
841
		if (i === num) {
842
			document.getElementById("div_notes").children[0].children[i].disabled = true;
843
			document.getElementById("div_notes").children[1 + i].hidden = false;
844
		} else {
845
			document.getElementById("div_notes").children[0].children[i].disabled = false;
846
			document.getElementById("div_notes").children[1 + i].hidden = true;
847
		}
848
	}
849
}
850
851
let btns = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
852
btns[0].onclick = function() {navMenu(0);};
853
btns[1].onclick = function() {navMenu(1);};
854
btns[2].onclick = function() {navMenu(2);};
855
btns[3].onclick = function() {navMenu(3);};
856
btns[4].onclick = function() {navMenu(4);};
857
858
btns = document.getElementById("div_notes").getElementsByTagName("button");
859
btns[0].onclick = function() {navNotesMenu(0);};
860
btns[1].onclick = function() {navNotesMenu(1);};
861
btns[2].onclick = function() {navNotesMenu(2);};
862
btns[3].onclick = function() {navNotesMenu(3);};
863
864
document.getElementById("txt_skey").onkeyup = function(e) {
865
	if (e.key === "Enter") document.getElementById("btn_enter").click();
866
};
867
868
navMenu(0);
869
870
});
871